package com.funsport.security;

import com.funsport.entity.Role;
import com.funsport.service.RoleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 数据权限辅助类
 * 用于判断当前用户的数据访问权限
 *
 * @author Fun-Sport Team
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class DataPermissionHelper {

    private final RoleService roleService;

    /**
     * 获取当前用户的角色列表
     */
    public List<String> getCurrentUserRoles() {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            List<Role> roles = roleService.getRolesByUserId(userId);
            return roles.stream().map(Role::getCode).collect(Collectors.toList());
        } catch (Exception e) {
            log.error("获取当前用户角色失败", e);
            return new ArrayList<>();
        }
    }

    /**
     * 判断当前用户是否是超级管理员
     */
    public boolean isSuperAdmin() {
        return getCurrentUserRoles().contains("SUPER_ADMIN");
    }

    /**
     * 判断当前用户是否是管理员（包括超级管理员）
     */
    public boolean isAdmin() {
        List<String> roles = getCurrentUserRoles();
        return roles.contains("SUPER_ADMIN") || roles.contains("ADMIN");
    }

    /**
     * 判断当前用户是否是俱乐部管理员
     */
    public boolean isClubManager() {
        return getCurrentUserRoles().contains("CLUB_MANAGER");
    }

    /**
     * 判断当前用户是否是场地管理员
     */
    public boolean isVenueManager() {
        return getCurrentUserRoles().contains("VENUE_MANAGER");
    }

    /**
     * 判断当前用户是否有查看所有数据的权限
     */
    public boolean canViewAllData() {
        return isAdmin();
    }

    /**
     * 获取当前用户ID（用于数据过滤）
     * @return 如果需要过滤数据则返回用户ID，否则返回null
     */
    public Long getDataFilterUserId() {
        if (canViewAllData()) {
            return null; // 不需要过滤
        }
        return SecurityUtils.getCurrentUserId();
    }
}

